package pers.xiaojun.boot.tenant.core.db;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import pers.xiaojun.boot.tenant.config.properties.TenantProperties;
import pers.xiaojun.boot.tenant.core.annotation.TenantIgnore;
import pers.xiaojun.boot.tenant.core.context.TenantContextHolder;

import java.util.HashSet;
import java.util.Set;

/**
 * mybatis 多租户插件
 *
 * @author xiaojun
 * @since 2025-11-21
 */
public class TenantDatabaseInterceptor implements TenantLineHandler {

    private final TenantProperties tenantProperties;

    private final Set<String> ignoreTables = new HashSet<>();

    public TenantDatabaseInterceptor(TenantProperties tenantProperties) {
        this.tenantProperties = tenantProperties;

        // 将表名转小写存入 ignoreTables 中
        tenantProperties.getIgnoreTables().forEach(table -> {
            ignoreTables.add(table.toLowerCase());
        });
    }

    @Override
    public Expression getTenantId() {
        return new LongValue(TenantContextHolder.getTenantId());
    }

    @Override
    public String getTenantIdColumn() {
        return tenantProperties.getColumn();
    }

    @Override
    public boolean ignoreTable(String tableName) {
        // 通过表名获取对应的表信息
        TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
        // 如果表信息为空，则表示非该系统的表，默认忽略
        if (tableInfo == null) {
            return true;
        }
        // 如果实体类上使用 TenantIgnore 注解，表示忽略
        if (tableInfo.getEntityType().isAnnotationPresent(TenantIgnore.class)) {
            return true;
        }
        // 通过实体表类继承自 TenantBaseEntity，代表为租户表，不忽略
        if (TenantBaseEntity.class.isAssignableFrom(tableInfo.getEntityType())) {
            // 如果也不在过滤表中，则不忽略
            return CollUtil.contains(ignoreTables, tableName.toLowerCase());
        }
        // 默认忽略
        return true;
    }

}
